函数
通过函数可以封装任意多条语句,可以在任何地方,任何时候调用执行。每个函数都是function
类型的实例,和其他引用类型一样具有属性和方法。
把函数保存为对象中的一个属性时,该属性称之为方法。
函数声明语法方式
普通声明方式
function sum (){
return num1 + num2;
}
使用变量初始化函数
var sum = function(num1,num2){
return num1 + num2;
}
使用function
构造函数,这种方法不推荐。这种方法便于理解“函数是对象,函数名是指针”的概念。
var sum = new Function("num1","num2","return num1 + num2");
delete
可删除属性,用法delete.a.name
作为值的函数
任何函数在任何时候都可以通过return
语句来返回值。需要注意的是位于return
语句之后的一句语句永远不会执行。
调用函数(方法)如果没有圆括号,会打印函数代码,有括号才会打印函数值。
function sum(num1,num2){
return num1 + num2; //返回 num1 + num2 相加的和
alert("Hello world!"); //永远也不会执行
}
函数参数
声明函数时没有给参数,但调用函数时会传参。
函数内部可用argument
方法获取,配合length
使用可动态传参。
function sum(){
if(arguments.length == 1){
alret(arguments[0] + 10);
}else if(arguments.length == 2){
alert(arguments[0] + arguments[1] + 10);
}
}
sum(10) //打印20
sum(10,20) //打印40
JavaScript 函数没有重载
重载是根据参数,选择相同函数名而参数不同的函数。
阶乘函数
function factorial(){
if(num < 1){
return 1;
}else{
return num * arguments.callee(num -1);//arguments.callee调用自身函数。这里调用的是factorial函数。
}
}
this
this
引用的是函数执行的环境对象,也就是函数调用语句所处的那个作用域。当网页在全局作用域中调用函数时,这个this
对象引用的就是window
。window
是一个对象,而且是JS
里最大的对象,是最外围的对象。
var color = "red"; //这里color是全局变量,而这变量又是window的属性
alert{window.color}; //打印"red",这说明color是window下的属性
alert(this.color); //同上
window.color = "red"; //相当于 var color = "red"
alert(this.color); //打印"red"
var o ={
color: "blue"; //这里的color是o下的属性,也就是局部变量
sayColor: function(){
alert(this.color); //这里的this代表的是o对象
}
};
o.sayColor(); //打印"blue"
下面的代码其实和上面是一样的,只是将sayColor()
函数作为方法赋值给o
,然后在通过o
来调用它
window.color = "red"; //全局
var o = {color: "blue"}; //局部
function sayColor(){
alert(this.color); //这里执行的时候是动态的,第一次指向window,第二次指向sayColor
}
sayColor(); //打印"red",因为这里是在window下的
o.sayColor = sayColor; //这里是吧把sayColor作为方法赋值给o,这样的话this就指代o了
o.sayColor(); //这里执行的是box里面的this.color,也就是说这里this指向了box
prototype
prototype
是保存他们所有实例方的真正所在,toString
和valueOf
等方法都是保存在peototype
名下,只不过是通过各自对象的实例访问。
每个函数都包含两个非继承而来的方法:apply()
和call()
这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this
对象的值。apple()
接收两个参数,一个是其中运行函数的作用域,另一个是参数数组。call()
与apple()
方法一样,区别是call()
方法传递给函数的参数必须逐个传。
function sum(num1,num2){
return num1 + num2;
}
function sum1(nu1,num2){
return sum.apply(this,arguments); //arguments可以当数值传,等于下面的[num1,num2];this表示window作用域
}
function sum2(nu1,numw){
return sum.apply(this,[num1,num2]); //apply可以冒充另一个函数,这里冒充了sum;[]表示传递的参数
}
alert(sum1(10,10)); //打印20
alert(sum2(10,10)); //打印20
这两方法最大的用处是:扩充函数运行的作用域。
window.color = "red"; //全局
var o = {color: "blue"}; //局部
function sayColor(){
alert(this.color); //这里this是动态的
}
sayColor(); //打印"red"
//用call实现对象冒充
sayColor.call(this); //冒充window
sayColor.call(window); //冒充window
sayColor.call(o); //冒充sayColor,用call的好处:对象不需要与方法发生任何耦合关系(耦合:互相关联的意思,扩展和维护会发生连锁反应)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。